package BDD.gestionnaires; 

import javax.ejb.Stateless;

import java.util.Collection;  
import javax.ejb.Stateless;  
import javax.persistence.EntityManager;  
import javax.persistence.PersistenceContext;  
import javax.persistence.Query;  
import BDD.modeles.*;  
import java.util.Date;
import javax.ejb.EJB;
import javax.persistence.NoResultException;

/**
 * @version 1.0.0
 * @author AZRIA Nouriel
 */
@Stateless
public class GestionnaireUtilisateur {
    
    @EJB
    private GestionnaireAlbum gestionnaireAlbum;
    
    @EJB
    private GestionnairePhoto gestionnairePhoto;
    
    @EJB
    private GestionnaireCommentaire gestionnaireCommentaire;
    
    @EJB
    private GestionnaireNotification gestionnaireNotification;

    // Ici injection de code : on n'initialise pas. L'entity manager sera créé  
    // à partir du contenu de persistence.xml  
    @PersistenceContext  
    private EntityManager em;
    
    
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    
    /* LES METHODES */
    
    public Utilisateur creeUtilisateur(String lastname, String firstname, String identifiant, String mdp, String mail) {
        
        // On cree l'utilisateur
        Utilisateur u = new Utilisateur(lastname, firstname, identifiant, mdp, mail, new Date());
        
        // On persiste
        em.persist(u);  
        return u;  
    }  
    
    /**
     * Methode permettant de modifier un utilisateur
     * @param user
     * @param identifiant
     * @param mdp
     * @param nom
     * @param prenom 
     */
    public void modifierUtilisateur(Utilisateur user, String identifiant, String mdp, String nom, String prenom, String mail) {
        // user est non connecté si on appelle cette méthode depuis un endroit 
        // où le gestionnaire de persistence em n'existe pas. 
        // C'est le cas si on appelle depuis une servlet ou une jsp
        
        // On reconnecte l'object
        Utilisateur userConnecte = em.merge(user);
        
        // ok, on a un user connecté, on va faire un getAlbums() pour
        // monter en mémoire les albums depuis la base, et on renvoie
        // l'utilisateur
        //System.out.println(userConnecte + " nb albums : " + userConnecte.getAlbums().size());
        
        Utilisateur u = em.find(Utilisateur.class, user.getId());

        // Modifier les parametres
        u.setIdentifiant(identifiant);
        u.setFirstname(prenom);
        u.setLastname(nom);
        u.setMdp(mdp);
        u.setMail(mail);

    }
    
    public Collection<Album> getSharedAlbum(Utilisateur u){
        String rq = "SELECT u.utilisateur_AlbumPartages.album* FROM Utilisateur u WHERE u.id=:id";
        Query q = em.createQuery(rq); 
            
        // Lier les parametres
        q.setParameter("id", u.getId());
        
        return q.getResultList();
    }
    
    /**
     * Renvoie l'id d'un utilisateur
     * @param identifiant l'identifiant de l'utilisateur
     * @return l'id de l'utilisateurs
     */
    public int getIdUtilisateur(String identifiant){
        
        String rq = "SELECT u FROM Utilisateur u WHERE u.identifiant=:identifiant";
        Query q = em.createQuery(rq); 
            
        // Lier les parametres
        q.setParameter("identifiant", identifiant);
        
        // Limiter le nombre de resultats
       q.setMaxResults(1);

       // Traiter les exceptions
       try{
           Utilisateur unUser = (Utilisateur)q.getSingleResult();
           return unUser.getId();
       }
       catch(NoResultException e){
           return -1;
       }
       catch(Exception e){
           return -1;
       }
    }
    
    /**
    * Permet de verifier si un utilisateur, dont le couple login et mot de passe est fourni, existe.
    * @param identifiant
    * @param mdp
    * @return 
    */
   public boolean userExists(String identifiant, String mdp){

       // Creer la requete
       String rq = "SELECT u FROM Utilisateur u WHERE u.identifiant=:identifiant AND u.mdp=:mdp";
       //String rq = "select u from Utilisateur u where u.login='" + login + "' and u.password='" + mdp + "'";

       // Executer la requete
       Query q = em.createQuery(rq); 

       // Lier les parametres
       q.setParameter("identifiant", identifiant);
       q.setParameter("mdp", mdp);

       // Limiter le nombre de resultats
       q.setMaxResults(1);

       // Traiter les exceptions
       try{
           q.getSingleResult();
       }
       catch(NoResultException e){
           return false;
       }
       catch(Exception e){

       }

       return true;
   }
   
   /**
    * Permet de verifier si un identifiant existe deja dans la BD.
    * @param identifiant
    * @return 
   */
   public boolean loginExiste(String identifiant){

       // Creer la requete
       String rq = "SELECT u FROM Utilisateur u WHERE u.identifiant=:identifiant";
       //String rq = "select u from Utilisateur u where u.login='" + login + "' and u.password='" + mdp + "'";

       // Executer la requete
       Query q = em.createQuery(rq); 

       // Lier les parametres
       q.setParameter("identifiant", identifiant);

       // Limiter le nombre de resultats
       q.setMaxResults(1);

       // Traiter les exceptions
       try{
           q.getSingleResult();
       }
       catch(NoResultException e){
           return false;
       }
       catch(Exception e){

       }

       return true;
   }
   
    public Utilisateur getUser(String identifiant, String mdp){ 
       String rq = "SELECT u FROM Utilisateur u WHERE u.identifiant=:identifiant AND u.mdp=:mdp";
       Query q = em.createQuery(rq);
       q.setParameter("identifiant", identifiant);
       q.setParameter("mdp", mdp);
       q.setMaxResults(1);
       return (Utilisateur)(q.getSingleResult());
   }
    
   public Utilisateur getUserByLogin(String identifiant){ 
       String rq = "SELECT u FROM Utilisateur u WHERE u.identifiant=:identifiant";
       Query q = em.createQuery(rq);
       q.setParameter("identifiant", identifiant);
       q.setMaxResults(1);
       return (Utilisateur)(q.getSingleResult());
   }
  
    public Collection<Utilisateur> getAllUsers() {  
        // Exécution d'une requête équivalente à un select *  
        Query q = em.createQuery("select u from Utilisateur u");  
        return q.getResultList();  
    }  

    // --- Methode IMPORTANTE pour la reception des lists de maniere correcte (en se connectant correctement a la BD)
    public Collection<Album> getAlbums(Utilisateur user) {
        // user est non connecté si on appelle cette méthode depuis un endroit 
        // où le gestionnaire de persistence em n'existe pas. 
        // C'est le cas si on appelle depuis une servlet ou une jsp
        
        // On reconnecte l'object
        Utilisateur userConnecte = em.merge(user);
        //em.refresh(userConnecte);
        
        // ok, on a un user connecté, on va faire un getAlbums() pour
        // monter en mémoire les albums depuis la base, et on renvoie
        // l'utilisateur
        //System.out.println(userConnecte + " nb albums : " + userConnecte.getAlbums().size());
        
        Utilisateur u = em.find(Utilisateur.class, user.getId());
        //System.out.println("Second test albums de user 1 : " + u.getAlbums());
        return u.getAlbums();
    }

    public void creerDonneesDeTest() {
        Utilisateur user = creeUtilisateur("Nom", "Prenom", "user", "mdp", "test@gmail.com");
        Utilisateur user2 = creeUtilisateur("Nom", "Prenom", "Raphael", "mdp", "test@gmail.com");
        Utilisateur user3 = creeUtilisateur("Nom", "Prenom", "Nouriel", "mdp", "test@gmail.com");
        
        Album a1 = gestionnaireAlbum.creeAlbum(user, "test0", false);
        Album a2 = gestionnaireAlbum.creeAlbum(user, "test2", false);
        
        Photo p1 = gestionnairePhoto.creePhoto(a1, "/ressources/imageTest/photo1.png", "photo1");
        Photo p2 = gestionnairePhoto.creePhoto(a1, "/ressources/imageTest/photo2.jpg", "photo2");
        Photo p3 = gestionnairePhoto.creePhoto(a1, "/ressources/imageTest/photo3.png", "photo3");
        
        Photo p4 = gestionnairePhoto.creePhoto(a2, "/ressources/imageTest/photo2.jpg", "photo2");
        
        Commentaire c1 = gestionnaireCommentaire.creeCommentaire(user, p1, "Le Chapeau-Poulet !!!");
        //gestionnaireNotification.creeNotification(user, c1);
        Commentaire c11 = gestionnaireCommentaire.creeCommentaire(user2, p1, "Un autre commentaire.");
        //gestionnaireNotification.creeNotification(user2, c11);
        Commentaire c2 = gestionnaireCommentaire.creeCommentaire(user2, p2, "C'est Alexstrasza.");
        //gestionnaireNotification.creeNotification(user2, c2);
        Commentaire c3 = gestionnaireCommentaire.creeCommentaire(user3, p3, "What da fuu !");
        //gestionnaireNotification.creeNotification(user3, c3);
    }
    
}
